package org.wangzhen.spring.event.orginal;

import java.util.Observable;
import java.util.Observer;

/**
 * java中观察者模式演示示例:
 * 1、和event的事件和监听有类似之处；
 * 2、Observable是消息发送者；
 * 3、Observer是消息的接受者；
 */
public class ObserverDemo {
    public static void main(String[] args) {
        // 它大爷的这个类有一个问题，就是每次notifyObservers观察者的时候，必须要调用setChanged方法才行
        // 但是发现了一个问题，就是setChanged方法时一个protect方法，不能直接调用Observable#setChanged
        // 必须继承这个类，才能调用setChanged方法
        Observable o1 = new Observable();

        // 定义一个消息发送者（Observable类似于一个主题？）
        Observable observable = new MyObservable();
        // 定义一个消息接受者/订阅者
        observable.addObserver(new MyObserver());
        // 当主题有消息变化的时候，通知所有订阅者
        observable.notifyObservers();
    }

    static class MyObservable extends Observable {
        @Override
        public void notifyObservers(Object arg) {
            this.setChanged();
            //
            super.notifyObservers(arg);
        }
    }


    static class MyObserver implements Observer {
        @Override
        public void update(Observable o, Object arg) {
            System.out.println("something has changed! Observable = " + o);
        }
    }

}

